/**
* Fichero que incluye las funciones y los ficheros de cabecera
* necesarios para el uso completo del subsistema de colaboracion.
* Se incluyen tambien dos variables globales: "event_handler" y
* "mi_service_connector". Mediante la primera, se podran registrar
* objetos en el sistema de colaboracion, asi como enviar y recibir 
* eventos distribuidos. Mediante el segundo se podra acceder correctamente
* al servicio de metainformacion.
*
* @author Carlos Rodriguez Dominguez
* @date 25/11/2008
*/

#ifndef _COLLABORATION_SUBSYSTEM_H_
#define _COLLABORATION_SUBSYSTEM_H_

#include "collaboration.h"
#include "eventHandler.h"  //Definicion de EventHandler
#include "MIServiceConnector.h" //Definicion de MIServiceConnector
#include "listeningObject.h" //Deficion de objetos que aceptan eventos distribuidos
#include "event.h" //modelado de eventos distribuidos
#include "eventListener.h" //listener de eventos distribuidos. Cada ListeningObject tendra varios
#include "MIEvent.h" //modelado de eventos de metainformacion (son emitidos por MIServiceConnector)
#include "MIListener.h" //listener para eventos de metainformacion
#include "drawingEvent.h" //modelado de eventos de dibujo
#include "drawingListener.h" //listener para eventos de dibujo
#include "pairEvent.h" //eventos asociados a parejas de datos en coma flotante
#include "Thread.h" //wrapper para la hebras

namespace collaboration{
	
	extern EventHandler* EVENT_HANDLER; /**< Manejador de eventos usado globalmente */
	extern MIServiceConnector* MI_SERVICE_CONNECTOR; /**< Conector con el servicio de metainformacion */

	/**
	* Inicializa el sistema de colaboracion. Una vez inicializado,
	* se podra hacer uso adecuadamente de la variable compartida "event_handler"
	*
	* @param argc Numero de argumentos introducidos por el terminal
	* @param argv Argumentos introducidos por el terminal
	* @return True si se inicializo el sistema de colaboracion. False
	*         en caso contrario.
	*
	* @post El sistema de colaboracion quedara inicializado y la variable global
	*       "event_handler" se inicializara debidamente.
	*/
	bool setup_environment(int argc, char** argv);
	
	/**
	* Destruye el sistema de colaboracion y la variable compartida
	* "event_handler". Si no se ha llamado a la funcion 
	* @see setup_environment entonces el comportamiento
	* es totalmente inesperado.
	*
	* @pre Se debe haber llamado a la funcion @see setup_environment
	* @post El sistema de colaboracion y la variable compartida "event_handler"
	*       seran destruidos.
	*/
	void shutdown_environment();
	
	/**
	* Inicializa el conector con el servicio de metainformacion. Previamente
	* debera haberse llamado a la funcion @see setup_environment.
	*
	* @param app Aplicacion
	* @param user Usuario
	* @param password Clave
	* @return True si se inicializo el conector con el servicio de metainformacion
	*        correctamente. False en caso contrario.
	*
	* @pre Se debe haber llamado a la funcion @see setup_environment
	* @post La variable compartida "mi_service_connector" quedara inicializada
	*/
	bool setup_MIServiceConnector(const char* app, const char* user, const char* password);
	
	/**
	* Destruye el conector con el servicio de metainformacion. Previamente debera
	* haberse llamado a la funcion @see setup_MIServiceConnector. 
	*
	* @pre Haber llamado a la funcion @see setup_MIServiceConnector.
	* @post El conector con el servicio de metainformacion sera destruido.
	*/
	void shutdown_MIServiceConnector();
	
	/**
	* Obtiene la lista de aplicaciones del sistema
	*
	* @return Lista de aplicaciones del sistema. Si no se ha inicializado
	*         el sistema de colaboracion, entonces se devuelve NULL.
	*/
	ListOfApplications* get_applications();
	
	/**
	* Obtiene la lista de usuarios de una aplicacion
	*
	* @param app Aplicacion
	* @return Lista de usuarios de la aplicacion
	*/
	ListOfUsers* get_users(const char* app);
	
}

#endif
